package com.longstring;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * the type of algorithm
 * <p>
 * 1.给出的字串能拼出父串吗
 * 2.字串出现的次数
 * <p>
 * .
 *
 * @author 铁甲小宝
 * @date 2022-11-03
 */
public class Competition {

    private static final String d1 = "D:\\文档1.txt";
    private static final String d2 = "D:\\文档2.txt";
    private static final String d3 = "D:\\词组.txt";
    private static final String strDateFormat = "yyyy-MM-dd HH:mm:ss:SSS";
    private static final SimpleDateFormat f = new SimpleDateFormat(strDateFormat);

    public static void main(String[] args) {
        /** 开始时间 */
        long startTime = System.currentTimeMillis();
        System.out.println("----程序开始执行，当前时间 " + f.format(startTime));


        // 1. 读文件，词组分割
        String s1 = readFile(d1);
        String s2 = readFile(d2);
        String sentence = readFile(d3);
        String[] words = sentence.split("、");

        // 2. 判断词组的词能不能拼接出
        boolean dispel1 = dispel(s1, words);
        boolean dispel2 = dispel(s2, words);


        // 3. 显示结果
        if (dispel1) {
            System.out.println("----能够拼接出文档1.txt中的文字，使用的词语及使用次数如下\n" + numberOfOccurrences(s1, words));
        } else {
            System.out.println("----无法拼接出文档1.txt中的文字");
        }

        if (dispel2) {
            System.out.println("----能够拼接出文档2.txt中的文字，使用的词语及使用次数如下\n" + numberOfOccurrences(s2, words));
        } else {
            System.out.println("----无法拼接出文档2.txt中的文字");
        }


        /** 结束时间 */
        long endTime = System.currentTimeMillis();
        long cost = endTime - startTime;
        System.out.println("----程序结束执行，当前时间 " + f.format(endTime) + ", 总计执行用时" + cost + "毫秒");
    }


    /**
     * 返回词组使用次数
     *
     * @param parent
     * @param children
     * @return
     */
    private static Map<String, Integer> numberOfOccurrences(String parent, String[] children) {
        HashMap<String, Integer> map = new HashMap<>();
        for (String child : children) {
            int count = 0;
            int index = parent.indexOf(child);
            // 进了循环说明找到了，使用次数直接+1
            while (index != -1) {
                count++;
                index = parent.indexOf(child, index + child.length());
            }
            // 子串+次数丢进map
            map.put(child, count);
        }

        return map;
    }

    /**
     * 判断能不能拼接
     *
     * @param parent
     * @param children
     * @return
     */
    private static boolean dispel(String parent, String[] children) {
        for (String child : children) {
            parent = parent.replaceAll(child, "");
        }
        return parent.length() == 0;
    }

    /**
     * 读文件
     *
     * @param name
     * @return
     */
    private static String readFile(String name) {
        InputStreamReader inputStreamReader;
        String line;
        StringBuilder b = new StringBuilder();
        try {
            inputStreamReader = new InputStreamReader(Files.newInputStream(Paths.get(name)), StandardCharsets.UTF_8);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            while ((line = bufferedReader.readLine()) != null) {
                b.append(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return b.toString();
    }
}
